package com.wjw.java.collection.set_;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * TreeSet是Set接口的实现类
 * TreeSet的底层是TreeMap，添加的数据存入了map的key的位置，而value则固定是PRESENT。
 * TreeSet中的元素是有序且不重复的，因为TreeMap中的key是有序且不重复的
 */
public class Detail_TreeSet {
    public static void main(String[] args) {
        //1.无参构造,comparator = null;
        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("bb");
        treeSet.add("a");
        treeSet.add("dddd");
        treeSet.add("ccc");
        treeSet.add("eeee");
        System.out.println(treeSet);

        System.out.println("------------------------------------");

        //2.有参构造,传入Comparator比较器
        TreeSet<String> treeSet2 = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //return o1.compareTo(o2);//按abcd排序
                return o1.length() - o2.length();//按字符串的长度排序,此时新增的时候,长度为1/2/3/4的字符串无法新增进去
            }
        });
        //执行add时,会调用比较器中的方法
        treeSet2.add("bb");
        treeSet2.add("ccc");
        treeSet2.add("a");
        treeSet2.add("dddd");
        treeSet2.add("eeee");//加入失败,因为Comparator的比较规则
        System.out.println(treeSet2);

        System.out.println("------------------------------------");

        //TreeSet的使用、去重、按年龄排序
        TreeSet<Cat> treeSet3 = new TreeSet<>();
        treeSet3.add(new Cat("布偶1",1));
        treeSet3.add(new Cat("布偶2",2));
        treeSet3.add(new Cat("布偶3",3));
        System.out.println(treeSet3);

        TreeSet<Cat> treeSet4 = new TreeSet<>(new Comparator<Cat>() {
            @Override
            public int compare(Cat o1, Cat o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        treeSet4.add(new Cat("布偶11",1));
        treeSet4.add(new Cat("布偶22",2));
        treeSet4.add(new Cat("布偶33",3));
        System.out.println(treeSet4);
    }
}

/**
 * TreeSet的使用与去重
 * 1.使用无参构造创建TreeSet,该集合中只能存放实现了Comparable接口的类,并重写compareTo方法,如果未实现Comparable
 * 会报类型转换错误,如Cat转为Comparable
 * 2.使用有参构造创建TreeSet,传入自定义比较器Comparator,并重写compare方法。
 */
class Cat implements Comparable<Cat>{
    private String name;

    private Integer age;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return this.age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    public Cat() {}

    public Cat(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "\n Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Cat cat) {
        return this.getAge() - cat.getAge();
    }
}